/**
 *
    算法描述：string的日常用法
    解决所需数据结构+算法：
**/
#include<iostream>
using namespace std;

int main() {
    int n, op, a, b;
    string s, ss;
    cin >> n >> s;
    while(n--) {
        cin >> op;
        switch (op) {
        case 1:
            cin >> ss;
            s += ss;
            cout << s << endl;
            break;
        case 2:
            cin >> a >> b;
            s = s.substr(a, b);
            cout << s << endl;
            break;
        case 3:
            cin >> a >> ss;
            s.insert(a, ss);
            cout << s << endl;
            break;
        case 4:
            cin >> ss;
            // 该处当find函数找不到我们需要的值的时候，函数并不会输出-1
            /**
             * 正常用法应该是：
             *      if(s.find(ss) == string::npos)   cout << -1 << endl;
             */
            if(s.find(ss) > s.length()) cout << -1 << endl;
            else cout << s.find(ss) << endl;
            break;
        default:
            cout << "处理异常输入场景，在正常测试数据中无作用" << endl;
            break;
        }
    }

    return 0;
}